﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.SafeJobHandle
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using System;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;

namespace Microsoft.InfoCards
{
  internal sealed class SafeJobHandle : SafeHandle
  {
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [SuppressUnmanagedCodeSecurity]
    [DllImport("Kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern bool TerminateJobObject([In] IntPtr hJob, [In] uint uExitCode);

    public SafeJobHandle()
      : base(IntPtr.Zero, true)
    {
    }

    public override bool IsInvalid
    {
      get
      {
        return IntPtr.Zero == this.handle;
      }
    }

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public void UpdateHandle(IntPtr handle)
    {
      this.SetHandle(handle);
    }

    protected override bool ReleaseHandle()
    {
      SafeJobHandle.TerminateJobObject(this.handle, 0U);
      return NativeMethods.SafeHandleOnlyMethods.CloseHandle(this.handle);
    }
  }
}
